home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / misc / math / VintEval_src.lha / VintEval / Vint-evaluator.S < prev    next >
Text File  |  1996-12-06  |  29KB  |  1,733 lines

  1. ;--------------
  2. ;--------------
  3. ;-------------- © 1996 Maurice van Wanum
  4. ;-------------- VInt, a course in calculating with long numbers
  5. ;--------------
  6.  
  7.     incdir    ASM-ONE:
  8.     include    Include.S    ; macros, exec, dos & intuition
  9.  
  10. nederlands    =1
  11. ; formaat :
  12. ; VInt = Lengte in woorden -1
  13. ;        woorden...
  14.     rsreset
  15. VI_Len    rs.w    1
  16. VI_Num    rs.w    1
  17.  
  18. MOVAL    macro
  19.     lea    \2(PC),\3
  20.     move.l    \1,(\3)
  21.     endm
  22.  
  23. debug    =0
  24. save    =01
  25.  
  26.     rsreset
  27. TxtLen    =    250
  28. Txt    rs.b    0
  29. OutBuff    rs.b    256
  30. A    rs.l    1
  31. B    rs.l    1
  32. C    rs.l    1
  33. DosBase    rs.l    1
  34. InHD    rs.l    1
  35. OutHD    rs.l    1
  36. PrpHD    rs.l    1
  37. MySize    rs.b    0
  38.  
  39.  
  40. j    move.l    4.w,a6            exec.lib
  41.     move.l    #MySize,d0
  42.     move.l    #$10001,d1
  43.     Lib    AllocMem        geheugen voor variabelen
  44.     move.l    d0,a5
  45.     tst.l    d0
  46.     beq.s    .nomem
  47.     
  48.     OpenLib    DosNaam
  49.     move.l    d0,DosBase(a5)
  50.     pea    closedos(PC)
  51.     
  52.    if save
  53.     auto    wo\
  54.  
  55.     sub.l    a1,a1
  56.     Lib    FindTask        ; onze task zoeken
  57.     move.l    d0,a4
  58.     tst.l    $ac(a4)
  59.     bne.S    CLIStart        ; geen 0 -> vanuit CLI (of Shell)
  60.             ; Workbench-Startup
  61.     lea    $5c(a4),a0
  62.     Lib    WaitPort
  63.     lea    $5c(a4),a0
  64.     Lib    GetMsg
  65.     move.l    d0,-(SP)
  66.     
  67.     move.l    DosBase(a5),a6
  68.     lea    _CON(PC),a0
  69.     move.l    a0,d1
  70.     move.l    #MODE_OLDFILE,d2
  71.     Lib    Open
  72.     lea    InHD(a5),a0
  73.     move.l    d0,(a0)+
  74.     beq.s    .nocon
  75.     bsr.s    WBStart
  76.     
  77. .nocon    move.l    DosBase(a5),a6
  78.     move.l    InHD(a5),d1
  79.     Lib    Close
  80.     move.l    (SP)+,a1
  81.     move.l    4.w,a6
  82.     LibJ    ReplyMsg
  83.    else
  84.     bra.s    CLIStart
  85.    endif
  86.  
  87. .nomem    moveq    #103,d0
  88.     rts
  89.     
  90. CLIStart
  91.  
  92.  
  93. ; begin van programma
  94.  
  95.     move.l    DosBase(a5),a6
  96.   if debug
  97.     lea    _CON(PC),a0
  98.     move.l    a0,d1
  99.     move.l    #MODE_OLDFILE,d2
  100.     Lib    Open
  101.   else
  102.     Lib    Input
  103.   endif
  104.     lea    InHD(a5),a0
  105.     move.l    d0,(a0)+
  106.   if debug=0
  107.     Lib    Output
  108.   endif
  109.   
  110. WBStart    lea    OutHD(a5),a0
  111.     move.l    d0,(a0)+
  112.     move.l    d0,(a0)+
  113.     beq.b    Exit
  114.     bsr.w    evalueer
  115. klaar    move.l    A(a5),d0
  116.     beq.b    .xB
  117.     move.l    d0,a1
  118.     bsr.w    FreeVInt
  119. .xB    move.l    B(a5),d0
  120.     beq.b    .xC
  121.     move.l    d0,a1
  122.     bsr.w    FreeVInt
  123. .xC    move.l    C(a5),d0
  124.     beq.b    .ex
  125.     move.l    d0,a1
  126.     bsr.w    FreeVInt
  127. .ex    lea    OutBuff(a5),a0
  128.     move.l    InHD(a5),d1
  129.     move.l    a0,d2
  130.     moveq    #1,d3
  131.     move.l    DosBase(a5),a6
  132.     Lib    Read
  133.   if debug
  134.     move.l    InHD(a5),d1
  135.     Lib    Close
  136.   endif
  137. Exit    rts
  138.       
  139. closedos
  140.     move.l    DosBase(a5),a1
  141.     move.l    4.w,a6
  142.     Lib    CloseLibrary
  143.     move.l    a5,a1
  144.     move.l    #MySize,d0
  145.     Lib    FreeMem
  146.     moveq    #0,d0
  147.     rts
  148.  
  149. GetKey    lea    OutBuff(a5),a0
  150.     move.l    InHD(a5),d1
  151.     move.l    a0,d2
  152.     moveq    #1,d3
  153.     move.l    DosBase(a5),a6
  154.     Lib    Read
  155.     tst.l    d0
  156.     beq.b    .ex
  157.     move.b    OutBuff(a5),d0
  158. .ex    rts
  159.  
  160. Getfile    lea    OutBuff+2(a5),a2
  161. .get    bsr.b    GetKey
  162.     cmp.b    #10,d0
  163.     beq.b    .ok
  164.     move.b    d0,(a2)+
  165.     bra.b    .get
  166. .ok    clr.b    (a2)
  167.     lea    OutBuff+2(a5),a0
  168.     rts
  169.  
  170. evalueer
  171.     moveq    #0,d4        ; 0 elementen op de stack
  172.     lea    _Prompt(PC),a0
  173.     move.l    DosBase(a5),a6
  174.     move.l    a0,d2
  175.     move.l    PrpHD(a5),d1
  176.     moveq    #3,d3
  177.     Lib    Write
  178.  
  179. evloop    bsr.b    GetKey
  180. evret    tst.b    d0        ; iets ging fout
  181.     beq.w    .exit
  182.     cmp.b    #'9',d0
  183.     bhi.b    .1
  184.     cmp.b    #'0',d0
  185.     bhs.w    HaalNum
  186.     
  187. .1    lea    .ktab(PC),a0
  188.     lea    .jtab(PC),a1
  189.     moveq    #[.kend-.ktab],d1
  190.     bra.w    KeyDecode
  191.     
  192. .ktab    dc.b    10,'?mxabc+-*/%=!^ ;<>'
  193. .kend
  194.     even
  195. .jtab    dr.w    .freestack,help,.mem,.exit
  196.     dr.w    .puA,.puB,.puC
  197.     dr.w    evAdd,evSub
  198.     dr.w    evMaal,evDeel,evMod
  199.     dr.w    evIS,evFac,evPower
  200.     dr.w    evloop,.eval,Input,Output
  201.     dr.w    .ong
  202.  
  203. .eval    addq    #1,d4
  204. .ev    subq    #1,d4
  205.     beq.b    evloop
  206.     pop.w    d0
  207.     pop.l    a1
  208.     bne.b    .ev        ; variabele => niet vrijgeven
  209.     bsr.w    FreeVInt    ; geef geheugen terug
  210.     bra.b    .ev
  211.  
  212. .ong    lea    _ong(PC),a0
  213.     bsr.w    PrintTxt
  214. .ong1    bsr.w    GetKey
  215.     cmp.b    #10,d0
  216.     bne.b    .ong1
  217. ;    bra    .freestack
  218.  
  219. .freestack
  220.     tst    d4
  221.     beq.w    evalueer
  222.     pop.w    d0
  223.     beq.b    .const        ; 0=constante
  224.     pop.l    a0        ; variabele => niet vrijgeven
  225.     move.l    (a0),a0
  226.     bsr.w    PrintVInt    ; printen
  227.     lea    _LF(PC),a0
  228.     bsr.w    PrintTxt    ; newline
  229. .dump    move.w    d4,d0
  230.     subq    #1,d0
  231.     beq.w    evalueer
  232.     push.w    d0
  233.     move.l    SP,a1
  234.     lea    _weg(PC),a0
  235.     bsr.w    print
  236.     addq.l    #2,SP
  237. .fr    subq    #1,d4
  238.     beq.w    evalueer
  239.     pop.w    d0
  240.     pop.l    a1
  241.     bne.b    .fr        ; variabele => niet vrijgeven
  242.     bsr.w    FreeVInt    ; geef geheugen terug
  243.     bra.b    .fr
  244.  
  245. .const    move.l    (SP),a0
  246.     bsr.w    PrintVInt
  247.     lea    _LF(PC),a0
  248.     bsr.w    PrintTxt
  249.     pop.l    a1
  250.     bsr.w    FreeVInt    ; geef geheugen terug
  251.     bra.b    .dump
  252.     
  253. .puA    pea    A(a5)
  254. .pu    push.w    #10        ; variabele <> 0
  255.     addq    #1,d4
  256.     bra.w    evloop
  257. .puB    pea    B(a5)
  258.     bra.b    .pu
  259. .puC    pea    C(a5)
  260.     bra.b    .pu
  261.  
  262. .exit    tst    d4
  263.     bne.w    evloop
  264. .ex    rts
  265.  
  266. .mem    bsr.w    Memory
  267.     bra.w    evloop
  268.  
  269. Input    tst.w    d4
  270.     bne.w    ErrMsg
  271.     bsr.w    Getfile
  272.     move.l    a0,d1
  273.     move.l    #MODE_OLDFILE,d2
  274.     Lib    Open
  275.     tst.l    d0
  276.     beq.s    IOerr
  277.     lea    InHD(a5),a0
  278.     push.l    (a0)
  279.     move.l    d0,(a0)
  280.     pea    CloseIn(PC)
  281.     move.l    d0,d1
  282.     Lib    IsInteractive
  283.     tst.l    d0
  284.     beq.s    .noterm        ; input is niet interactive => output gebruiken
  285.     move.l    InHD(a5),PrpHD(a5)    ; input voor prompt weergave
  286.     bra.w    evalueer
  287. .noterm    move.l    OutHD(a5),PrpHD(a5)
  288.     bra.w    evalueer
  289.  
  290. IOerr    lea    _IOerr(PC),a0
  291.     bsr.w    PrintTxt
  292.     bra.w    evalueer
  293.  
  294. Output    tst.w    d4
  295.     bne.w    ErrMsg
  296.     bsr.w    Getfile
  297.     move.l    a0,d1
  298.     move.l    #MODE_NEWFILE,d2
  299.     Lib    Open
  300.     tst.l    d0
  301.     beq.s    IOerr
  302.     lea    OutHD(a5),a0
  303.     push.l    (a0)
  304.     move.l    d0,(a0)
  305.     pea    CloseOut(PC)
  306.     move.l    InHD(a5),d1
  307.     Lib    IsInteractive
  308.     tst.l    d0
  309.     bne.w    evalueer    ; input is interactive => prompt-handler ok
  310.     move.l    OutHD(a5),PrpHD(a5)
  311.     bra.w    evalueer
  312.     
  313. CloseIn    move.l    DosBase(a5),a6
  314.     move.l    InHD(a5),d1
  315.     Lib    Close
  316.     pop.l    d1
  317.     move.l    d1,InHD(a5)
  318.     move.l    d1,PrpHD(a5)
  319.     Lib    IsInteractive
  320.     tst.l    d0
  321.     bne.w    evloop
  322.     move.l    OutHD(a5),PrpHD(a5)
  323.     bra.w    evloop
  324.     
  325. CloseOut
  326.     move.l    DosBase(a5),a6
  327.     move.l    OutHD(a5),d1
  328.     Lib    Close
  329.     pop.l    d1
  330.     move.l    d1,OutHD(a5)
  331.     move.l    d1,PrpHD(a5)
  332.     move.l    InHD(a5),d1
  333.     Lib    IsInteractive
  334.     tst.l    d0
  335.     beq.w    evloop
  336.     move.l    InHD(a5),PrpHD(a5)
  337.     bra.w    evloop
  338.  
  339. HaalNum    and.w    #$f,d0
  340.     bsr.w    Word2VInt
  341.     push.l    d0
  342.     beq.b    .err
  343. .get    bsr.w    GetKey
  344.     tst.b    d0
  345.     beq.b    .klaar        ; fout
  346.     cmp.b    #10,d0
  347.     beq.b    .klaar        ; LF
  348.     cmp.b    #'9',d0
  349.     bhi.b    .klaar        ; geen cijfer
  350.     cmp.b    #'0',d0
  351.     blo.b    .klaar        ; geen cijfer
  352.     and.w    #$f,d0
  353.     bsr.w    Word2VInt
  354.     push.l    d0
  355.     beq.b    .err
  356.     lea    tien(PC),a0
  357.     move.l    4(SP),a1
  358.     bsr.w    MulVInt
  359.     tst.l    d0
  360.     beq.b    .err2
  361.     
  362.     move.l    4(SP),a1
  363.     move.l    d0,4(SP)
  364.     bsr.w    FreeVInt
  365.     move.l    4(SP),a0
  366.     move.l    (SP),a1
  367.     bsr.w    AddVInt
  368.     tst.l    d0
  369.     beq.b    .err2
  370.     move.l    d0,a2
  371.     pop.l    a1
  372.     bsr.w    FreeVInt
  373.     pop.l    a1
  374.     bsr.w    FreeVInt
  375.     push.l    a2
  376.     bra.b    .get
  377.     
  378. .klaar    clr.w    -(SP)        ; constante
  379.     addq    #1,d4
  380.     bra.w    evret    
  381.  
  382. .err2    pop.l    a1        ; geef cijfer terug
  383.     bsr.w    FreeVInt
  384.     pop.l    a1
  385.     bsr.w    FreeVInt    ; geef getal terug
  386.     bra.b    ErrMsg        ; print error
  387.     
  388. .err    addq.l    #4,SP
  389. ;    bra    ErrMSg
  390.  
  391. ErrMsg    lea    _error(PC),a0
  392.     bsr.w    PrintTxt
  393.     bra.w    evloop
  394.                     
  395. help    lea    _help(PC),a0
  396.     bsr.w    PrintTxt
  397.     bra.w    evloop
  398.  
  399. evAdd    lea    AddVInt(PC),a2
  400.     bra.w    evAlg
  401. evSub    lea    SubVInt(PC),a2
  402.     bra.w    evAlg
  403. evMaal    lea    MulVInt(PC),a2
  404.     bra.w    evAlg
  405. evDeel    lea    DeelVInts(PC),a2
  406.     bra.w    evAlg
  407.     
  408. evMod    cmp.b    #2,d4
  409.     blo.w    evloop        ; minder dan twee argumenten
  410.     moveq    #0,d2
  411.     pop.w    d1
  412.     pop.l    a1        argument 1
  413.     pop.w    d0
  414.     pop.l    a0        argument 2
  415.     tst.w    d0
  416.     bne.b    .1
  417.     push.l    a0
  418.     addq    #1,d2
  419.     bra.b    .1a
  420. .1    move.l    (a0),a0
  421. .1a    tst.w    d1
  422.     bne.b    .2
  423.     push.l    a1
  424.     addq    #1,d2
  425.     bra.b    .2a
  426. .2    move.l    (a1),a1
  427. .2a    bsr    DeelVIntsMod        bepaal quotient + modulo
  428.     move.l    d1,d3
  429.     move.l    d0,a1
  430.     bsr    FreeVInt        geef quotient vrij
  431. .4    subq    #1,d2
  432.     bcs.b    .3
  433.     pop.l    a1
  434.     bsr.w    FreeVInt        geef argument vrij    
  435.     bra.b    .4
  436. .3    tst.l    d3
  437.     beq.b    .err
  438.     push.l    d3            sla modulo op
  439.     clr.w    -(SP)
  440.     subq    #1,d4
  441.     bra.w    evloop            ga verder
  442. .err    subq    #2,d4
  443.     bra.w    ErrMsg
  444.     
  445. evPower    lea    PowerVInt(PC),a2
  446.     bra.w    evAlg
  447.     
  448. evIS    cmp.b    #2,d4
  449.     blo.w    evloop        ; minder dan twee argumenten
  450.     tst.w    (SP)
  451.     beq.b    .ongel        ; geen variabele als tweede argument
  452.     addq.l    #2,SP
  453.     subq    #1,d4
  454.     move.l    (SP),a1
  455.     move.l    (a1),a1
  456.     bsr.w    FreeVInt
  457.     pop.l    a1
  458.     pop.w    d0
  459.     pop.l    a0
  460.     beq.b    .ok
  461.     move.l    (a0),a0
  462.     push.l    a1
  463.     bsr.w    CopyVInt
  464.     pop.l    a1
  465.     move.l    d0,a0
  466.     tst.l    d0
  467.     beq.b    .err
  468. .ok    move.l    a0,(a1)
  469.     push.l    a1
  470.     push.w    #10
  471.     bra.w    evloop
  472. .err    subq    #1,d4
  473.     bra.w    ErrMsg
  474.     
  475. .ongel    lea    _ong(PC),a0
  476.     bsr.w    PrintTxt
  477.     bra.w    evloop
  478.  
  479. evFac    cmp.b    #1,d4
  480.     blo.w    evloop
  481.     moveq    #0,d2
  482.     pop.w    d0
  483.     pop.l    a1
  484.     beq.b    .ok
  485.     move.l    (a1),a1
  486.     bra.b    .ok2
  487. .ok    moveq    #1,d2
  488. .ok2    subq    #1,d4
  489.     tst.w    (a1)
  490.     bne.b    .err
  491.     push.w    2(a1)
  492.     tst.w    d2
  493.     beq.b    .1
  494.     bsr.w    FreeVInt
  495. .1    pop.w    d0    
  496.     bsr.b    Fac
  497.     tst.l    d0
  498.     beq.w    ErrMsg
  499.     addq    #1,d4
  500.     push.l    d0
  501.     clr.w    -(SP)
  502.     bra.w    evloop
  503. .err    tst.w    d2
  504.     beq.w    ErrMsg
  505.     bsr.w    FreeVInt
  506.     bra.w    evloop
  507.  
  508. evAlg    cmp.b    #2,d4
  509.     blo.w    evloop        ; minder dan twee argumenten
  510.     moveq    #0,d2
  511.     pop.w    d1
  512.     pop.l    a1
  513.     pop.w    d0
  514.     pop.l    a0
  515.     tst.w    d0
  516.     bne.b    .1
  517.     push.l    a0
  518.     addq    #1,d2
  519.     bra.b    .1a
  520. .1    move.l    (a0),a0
  521. .1a    tst.w    d1
  522.     bne.b    .2
  523.     push.l    a1
  524.     addq    #1,d2
  525.     bra.b    .2a
  526. .2    move.l    (a1),a1
  527. .2a    jsr    (a2)
  528.     move.l    d0,d3
  529. .4    subq    #1,d2
  530.     bcs.b    .3
  531.     pop.l    a1
  532.     bsr.w    FreeVInt
  533.     bra.b    .4
  534. .3    tst.l    d3
  535.     beq.b    .err
  536.     push.l    d3
  537.     clr.w    -(SP)
  538.     subq    #1,d4
  539.     bra.w    evloop
  540. .err    subq    #2,d4
  541.     bra.w    ErrMsg
  542.     
  543. ;===== in  : d0 = int van de te berekenen faculteit
  544. ;===== uit : d0 = VInt
  545. Fac    tst.w    d0
  546.     beq.b    .een
  547.     movem.l    d2/d3/a2,-(SP)
  548.     moveq    #0,d2
  549.     move.w    d0,d2
  550.     moveq    #1,d0
  551.     bsr.w    Word2VInt
  552.     move.l    d0,a2
  553.     tst.l    d0
  554.     beq.b    .err
  555.     moveq    #2,d3
  556. .lus    cmp    d2,d3
  557.     bhi.s    .klaar
  558.     move.l    d3,-(SP)
  559.     move.l    SP,a0
  560.     move.l    a2,a1
  561.     bsr    MulVInt
  562.     addq    #4,SP
  563.     tst.l    d0
  564.     beq.b    .free
  565.     move.l    a2,a1
  566.     move.l    d0,a2
  567.     bsr    FreeVInt
  568.     addq    #1,d3
  569.     bra.b    .lus
  570. .klaar    move.l    a2,d0
  571.     movem.l    (SP)+,d2/d3/a2
  572.     rts
  573. .free    move.l    a2,a1
  574.     bsr.w    FreeVInt    
  575. .err    moveq    #0,d0
  576.     rts
  577. .een    moveq    #1,d0
  578.     bra.w    Word2VInt
  579.  
  580. ; in  a0=VInt1
  581. ;     a1=VInt2
  582. ; uit d0=nieuw VInt
  583. ; A + B -> C
  584. AddVInt    movem.l    d2/d3/a2/a3,-(SP)
  585.     move.w    (a1),d0
  586.     cmp.w    (a0),d0
  587.     bmi.s    .1
  588.     exg    a0,a1        ; a0=grootste int
  589. .1    moveq    #0,d0
  590.     moveq    #0,d1
  591.     move.w    (a0),d0        ; aantal woorden langste
  592.     move.w    (a1),d1        ; aantal woorden kortste
  593.     move.w    d0,d2
  594.     move.w    d1,d3
  595.     add.l    d0,d0
  596.     add.l    d1,d1
  597.     lea    4(a0,d0.l),a2    ; einde van langste
  598.     lea    4(a1,d1.l),a3    ; einde van kortste
  599.     move.w    d2,d0
  600.     bsr.w    MaakVInt    ; grootste kopieeren
  601.     tst.l    d0
  602.     beq.b    .ex        ; mislukt
  603.     move.l    d0,a0
  604.     moveq    #0,d0
  605.     move.w    d2,d0
  606.     add.l    d0,d0
  607.     lea    4(a0,d0.l),a1    ; einde van de nieuwe
  608.     sub.w    d3,d2        ; verschil tussen langste en kortste
  609.     asr.w    #1,d3
  610.     dc.w    $023c,1        ; foutje in de assembler
  611. ;    andi.b    #1,CCR    ; de eigenlijke opcode
  612.     bcs.b    .lusin    ; X-bit is nu nooit gezet
  613.     move.w    -(a2),d0
  614.     move.w    -(a3),d1
  615.     add.w    d1,d0
  616.     dbf    d3,.lusk
  617.     dbf    d2,.ok
  618.     bcs.s    .ovf        ; getal is te lang => langer maken
  619.     move.w    d0,-(a1)
  620.     bra.b    .end
  621.     
  622. .lusk    move.w    d0,-(a1)
  623.     bra.b    .lusin
  624. .lus    move.l    d0,-(a1)
  625. .lusin    move.l    -(a2),d0
  626.     move.l    -(a3),d1
  627.     addx.l    d1,d0
  628.     dbf    d3,.lus
  629.     dbf    d2,.ok2
  630.  
  631.     bcc.b    .klaar        ; geen overflow => we zijn klaar met optellen
  632.     move.l    d0,-(a1)
  633.     bra.b    .ovfl    ; overflow
  634.     
  635. .ok2    move.l    d0,-(a1)
  636.     moveq    #0,d1
  637.     bra.b    .ext2
  638. .ok    moveq    #0,d1
  639. .ext    move.w    d0,-(a1)
  640. .ext2    move.w    -(a2),d0
  641.     addx.w    d1,d0
  642.     dbf    d2,.ext
  643.     bcs.b    .ovf        ; overflow
  644. .ends    move.w    d0,-(a1)
  645.     bra.b    .end
  646. .klaar    move.l    d0,-(a1)
  647. .end    move.l    a0,d0        ; keer terug
  648. .ex    movem.l    (SP)+,d2/d3/a2/a3
  649.     rts
  650.         
  651. .ovf    move.w    d0,-(a1)
  652. .ovfl    bsr.w    ExtendVInt
  653.     bra.b    .ex
  654.  
  655. ; in  a0=VInt1
  656. ;     a1=VInt2
  657. ; uit d0=nieuw VInt
  658. ; A - B -> C
  659. SubVInt    movem.l    d2/d3/a2/a3,-(SP)
  660.     move.w    (a1),d0
  661.     cmp.w    (a0),d0
  662.     bhi.w    .err        ; a1 > a0 => negatief antwoord
  663.                 ; a0=grootste int
  664. .1    moveq    #0,d0
  665.     moveq    #0,d1
  666.     move.w    (a0),d0        ; aantal woorden langste
  667.     move.w    (a1),d1        ; aantal woorden kortste
  668.     move.w    d0,d2
  669.     move.w    d1,d3
  670.     add.l    d0,d0
  671.     add.l    d1,d1
  672.     lea    4(a0,d0.l),a2    ; einde van langste
  673.     lea    4(a1,d1.l),a3    ; einde van kortste
  674.     move.w    d2,d0
  675.     bsr.w    MaakVInt    ; grootste kopieeren
  676.     tst.l    d0
  677.     beq.b    .ex        ; mislukt
  678.     move.l    d0,a0
  679.     moveq    #0,d0
  680.     move.w    d2,d0
  681.     add.l    d0,d0
  682.     lea    4(a0,d0.l),a1    ; einde van de nieuwe
  683.     sub.w    d3,d2        ; verschil tussen langste en kortste
  684.     asr.w    #1,d3
  685.     dc.w    $023c,1        ; foutje in de assembler
  686. ;    andi.b    #1,CCR    ; de eigenlijke opcode
  687.     bcs.b    .lusin    ; X-bit is nu nooit gezet
  688.     move.w    -(a2),d0
  689.     move.w    -(a3),d1
  690.     sub.w    d1,d0
  691.     dbf    d3,.lusk
  692.     dbf    d2,.ok
  693.     bcs.s    .ovf    ; overflow
  694.     move.w    d0,-(a1)
  695.     bra.b    .end
  696.     
  697. .lusk    move.w    d0,-(a1)
  698.     bra.b    .lusin
  699. .lus    move.l    d0,-(a1)
  700. .lusin    move.l    -(a2),d0
  701.     move.l    -(a3),d1
  702.     subx.l    d1,d0
  703.     dbf    d3,.lus
  704.     dbf    d2,.ok2
  705.  
  706.     bcc.b    .klaar        ; geen overflow => we zijn klaar met optellen
  707.     bra.b    .ovf    ; overflow
  708.     
  709. .ok2    move.l    d0,-(a1)
  710.     moveq    #0,d1
  711.     bra.b    .ext2
  712. .ok    moveq    #0,d1
  713. .ext    move.w    d0,-(a1)
  714. .ext2    move.w    -(a2),d0
  715.     subx.w    d1,d0
  716.     dbf    d2,.ext
  717.     bcs.b    .ovf    ; overflow
  718. .ends    move.w    d0,-(a1)
  719.     bra.b    .end
  720. .klaar    move.l    d0,-(a1)
  721. .end    bsr.w    ShrinkVInt    ; keer terug
  722. .ex    movem.l    (SP)+,d2/d3/a2/a3
  723.     rts
  724. .err    moveq    #0,d0
  725.     bra.b    .ex    
  726. .ovf    move.l    a0,a1
  727.     bsr.w    FreeVInt
  728.     bra.b    .err
  729.  
  730. ; in  a0 = VInt1
  731. ;     a1 = VInt2
  732. ; uit d0 = nieuw VInt
  733. ; A * B -> C
  734. MulVInt    movem.l    d2-d4/a2/a3,-(SP)
  735.  
  736.     moveq    #0,d0
  737.     moveq    #0,d1
  738.     move.w    (a0),d0        ; aantal woorden int1
  739.     move.w    (a1),d1        ; aantal woorden int2
  740.     move.w    d0,d2
  741.     move.w    d1,d3
  742.     add.l    d0,d0
  743.     add.l    d1,d1
  744.     lea    4(a0,d0.l),a2    ; einde van int1
  745.     lea    4(a1,d1.l),a3    ; einde van int2
  746.     move.w    d2,d0
  747.     add.w    d3,d0
  748.     bcs.b    .ex        ; overflow
  749.     addq    #1,d0
  750.     bcs.b    .ex        ; overflow
  751.     bsr.w    MaakVInt    ; grootste kopieeren
  752.     tst.l    d0
  753.     beq.b    .ex        ; mislukt
  754.     move.l    d0,a0
  755.     moveq    #0,d0
  756.     move.w    (a0),d0
  757.     add.l    d0,d0
  758.     lea    4(a0,d0.l),a1    ; einde van de nieuwe
  759. .lus1    push.w    d2
  760.     move.w    #0,CCR
  761.     move.w    -(a3),d0
  762. .lus    move.w    -(a2),d1
  763.     mulu    d0,d1
  764.     add.l    d1,-(a1)
  765.     bcc.s    .l1
  766.     moveq    #0,d1
  767. .l2    addq    #4,d1
  768.     addq.l    #1,-(a1)
  769.     bcs.s    .l2
  770.     add.l    d1,A1
  771. .l1    addq    #2,a1
  772.     dbf    d2,.lus
  773.     pop.w    d2
  774.     moveq    #0,d0
  775.     move.w    d2,d0
  776.     add.l    d0,d0
  777.     lea    2(a2,d0.l),a2
  778.     add.l    d0,a1
  779.     dbf    d3,.lus1
  780.     bsr.w    ShrinkVInt
  781. .ex    movem.l    (SP)+,d2-d4/a2/a3
  782.     rts
  783.  
  784. ; in  a0 = VInt
  785. ;     d0 = Deler (int)
  786. ; uit d0 = nieuw VInt
  787. ;     d1 = Modulo.w
  788. ; A / B -> C
  789. DeelVInt
  790.     movem.l    d2/a2/a3,-(SP)
  791.     move.l    d0,d2
  792.     move.w    (a0)+,d0
  793.     move.l    a0,a2
  794.     bsr.w    MaakVInt
  795.     tst.l    d0
  796.     beq.b    .ex        ; mislukt
  797.     move.l    d0,a1
  798.     move.l    d0,a0
  799.     move.w    (a1)+,d0
  800.     moveq    #0,d1
  801. .lus    move.w    (a2)+,d1
  802.     divu    d2,d1
  803.     move.w    d1,(a1)+
  804.     dbf    d0,.lus
  805.     swap    d1
  806.     push.w    d1
  807.     bsr.w    ShrinkVInt
  808.     moveq    #0,d1
  809.     pop.w    d1
  810. .ex    movem.l    (SP)+,d2/a2/a3
  811.     rts
  812.  
  813. ; in  a0 = VInt1 (A)
  814. ;     a1 = VInt2 (B)
  815. ; uit d0 = nieuw VInt (C)
  816. ; A / B -> C
  817. DeelVInts
  818.     tst.w    (a1)
  819.     beq.s    .1
  820.     bsr.b    DeelVIntsIt
  821.     push.l    d0
  822.     move.l    d1,a1
  823.     bsr.w    FreeVInt
  824.     pop.l    d0
  825.     rts
  826. .1    move.w    2(a1),d0
  827.     bra.b    DeelVInt
  828.  
  829. ; in  a0 = VInt1 (A)
  830. ;     a1 = VInt2 (B)
  831. ; uit d0 = nieuw VInt (C)
  832. ; uit d1 = modulo VInt (D)
  833. ; A / B -> C r D
  834. DeelVIntsMod
  835.     tst.w    (a1)
  836.     beq.s    .1
  837.     bsr.b    DeelVIntsIt
  838.     push.l    d0
  839.     move.l    d1,a0
  840.     bsr.w    ShrinkVInt
  841.     move.l    d0,d1
  842.     pop.l    d0
  843.     rts
  844. .1    move.w    2(a1),d0
  845.     bsr.b    DeelVInt
  846.     push.l    d0
  847.     move.w    d1,d0
  848.     bsr.w    Word2VInt
  849.     move.l    d0,d1
  850.     pop.l    d0
  851.     rts
  852.  
  853. ; in  a0 = VInt1 (A)
  854. ;     a1 = VInt2 (B)
  855. ; uit d0 = nieuw VInt (C)
  856. ; uit d1 = modulo VInt (D)
  857. ; A / B -> C r D
  858. DeelVIntsIt
  859.     movem.l    d2-d4/a2-a4,-(SP)
  860.  
  861.     move.l    a0,a2        ; langste (grootste)
  862.     move.l    a1,a3        ; kortste (kleinste)
  863.     move.w    (a1)+,d1
  864.     move.w    (a0)+,d0
  865.     cmp.w    d1,d0
  866.     blo.w    .null        ; A < B => A/B=0
  867.     bne.b    .ok
  868.     
  869. .1    cmpm.w    (a0)+,(a1)+
  870.     dbne    d0,.1
  871.     beq.w    .een        ; de 2 ints zijn gelijk => A/B=1
  872.     bhi.w    .null        ; A < B => A/B=0
  873.     move.w    d1,d0
  874. ;=== maak antwoord VInt
  875. .ok    sub.w    d1,d0
  876.     bsr.w    MaakVInt
  877.     tst.l    d0
  878.     beq.w    .ex
  879.     push.l    d0
  880.     move.l    d0,a4
  881.     addq    #2,a4
  882. ;=== kopieer langste, deze bevat uiteindelijk de modulo
  883.     move.l    a2,a0
  884.     bsr.w    CopyVInt
  885.     tst.l    d0
  886.     beq.w    .freeint
  887.     move.l    d0,a2
  888. ;==== We gaan nu uitzoeken welke van de twee VInts de hoogste bit heeft
  889. .lus
  890. ;=== a2 = copy van langste
  891. ;=== a3 = kortste
  892. ;=== a4 = antwoord
  893. ;=== (SP) = antwoord
  894.     moveq    #15,d4
  895.     move.w    2(a2),d1
  896. .2    btst    d4,d1
  897.     dbne    d4,.2        ; d4 = bitnummer hoogste gezette bit langste
  898.     moveq    #15,d3
  899.     move.w    2(a3),d1
  900. .5    btst    d3,d1
  901.     dbne    d3,.5        ; d3 = bitnummer hoogste gezette bit kortste
  902. ;==== Zet bit d4 min d3 in antwoord op 1
  903.     move.w    d4,d1
  904.     sub.w    d3,d1
  905.     blo.w    .v1        ; negatief bitnummer -> kan niet
  906.     move.w    d1,d3
  907. ;=== schuif kortste naar links
  908.     move.w    d3,d0
  909.     beq.s    .ns
  910.     move.l    a3,a0
  911.     bsr.w    ShiftVIntL
  912. .ns
  913. ;=== zet bit in antwoord
  914. .terug    move.w    (a4),d0
  915.     bset    d3,d0
  916.     move.w    d0,(a4)
  917. ;=== kijken of we kunnen aftrekken
  918.     move.w    2(a2),d0
  919.     cmp.w    2(a3),d0
  920.     bcs.b    .foutv2         ; nee
  921. ;=== aftekken
  922.     moveq    #0,d0
  923.     move.w    (A3),d0
  924.     add.l    d0,d0
  925.     lea    4(a3,d0.l),a0
  926.     lea    4(a2,d0.l),a1
  927.     lsr.l    #1,d0
  928. .3    subx.w    -(a0),-(a1)
  929.     dbf    d0,.3
  930.     bcs.b    .foutje2    ; foutje, aftrekken kon toch niet
  931. .check
  932.     subq    #1,d3
  933.     bcs.b    .verder        ; hier zijn we klaar
  934. ;=== verschuif kortste 1 naar rechts
  935.     moveq    #1,d0
  936.     move.l    a3,a0
  937.     bsr.w    ShiftVIntR
  938.     bra.b    .terug
  939.  
  940. .foutje2    ; we herstellen de vorige toestand
  941.     moveq    #0,d0
  942.     move.w    (a3),d0
  943.     add.l    d0,d0
  944.     lea    4(a3,d0.l),a0
  945.     lea    4(a2,d0.l),a1
  946.     lsr.l    #1,d0
  947. .v5    addx.w    -(a0),-(a1)
  948.     dbf    d0,.v5
  949. .foutv2
  950.     move.w    (a4),d1
  951.     bclr    d3,d1
  952.     move.w    d1,(a4)
  953.     bra.b    .check
  954.  
  955. .klaar    pop.l    a0
  956.     bsr.w    ShrinkVInt
  957.     move.l    a2,d1
  958. .ex    movem.l    (SP)+,d2-d4/a2-a4
  959.     rts
  960.  
  961. ;====== De rest van de deling
  962. .verder    move.l    a2,a0
  963.     move.l    a3,a1
  964.     move.w    (a0)+,d0
  965.     move.w    (a1)+,d1
  966.     cmp.w    d0,d1
  967.     bhi.b    .klaar        ; A < B => A/B=0
  968.     bne.b    .ver2        ;ok
  969.     
  970. .v2    cmpm.w    (a0)+,(a1)+
  971.     dbne    d0,.v2
  972.     bhi.b    .klaar        ; A < B => A/B=0
  973.  
  974. .ver2    move.w    d3,d1
  975. ;=== zet de bit in het antwoord
  976. .v1    moveq    #0,d2
  977.     move.w    d1,d2
  978.     add.w    #16,d1
  979.     addq.l    #2,a4
  980.     move.w    (a4),d0
  981.     bset    d1,d0
  982.     move.w    d0,(a4)
  983. ;=== verschuif de langste naar links
  984.     neg.w    d2
  985.     move.w    d1,d3
  986.     move.w    d2,d0
  987.     move.l    a2,a0
  988.     bsr.w    ShiftVIntL
  989. ;=== kijken of we kunnen aftrekken
  990. .tmin    move.w    2(a2),d0
  991.     cmp.w    2(a3),d0
  992.     bcs.w    .foutv    ; nee
  993. ;=== aftrekken
  994.     moveq    #0,d0
  995.     move.w    (A3),d0
  996.     add.l    d0,d0
  997.     lea    4(a3,d0.l),a0
  998.     lea    4(a2,d0.l),a1
  999.     lsr.l    #2,d0
  1000.     bcs.s    .v32
  1001.     subx.w    -(A0),-(a1)
  1002.     dbf    d0,.v3
  1003.     bra.b    .v31
  1004. .v32    move    #0,CCR
  1005. .v3    subx.l    -(a0),-(a1)
  1006.     dbf    d0,.v3
  1007. .v31    bcs.b    .foutje        ; aftrekken kon toch niet
  1008. .ovfret    subq    #1,d3
  1009.     bcs.b    .checkm
  1010. ;=== zet bit
  1011. .ok3    move.w    (a4),d1
  1012.     bset    d3,d1
  1013.     move.w    d1,(a4)
  1014. ;=== verschuif de langste 1 naar links
  1015.     moveq    #1,d0
  1016.     move.l    a2,a0
  1017.     bsr.w    ShiftVIntL
  1018.     moveq    #0,d0
  1019.     roxl.w    #1,d0
  1020.     beq.b    .tmin
  1021.     bra.b    .ovf        ; overflow
  1022.  
  1023. .checkm    addq.l    #2,a4
  1024.     add.w    #16,d3
  1025.     move.l    a2,a0
  1026.     bsr.w    CutOff
  1027.     move.l    a2,a0
  1028.     move.l    a3,a1
  1029.     move.w    (a0)+,d0
  1030.     move.w    (a1)+,d1
  1031.     cmp.w    d0,d1
  1032.     bhi.w    .klaar        ; A < B => A/B=0
  1033.     bne.b    .ok3        ;ok
  1034.     
  1035. .1m    cmpm.w    (a0)+,(a1)+
  1036.     dbne    d0,.1m
  1037.     bhi.w    .klaar        ; A < B => A/B=0
  1038.     bra.b    .ok3        ; ok
  1039.     
  1040. .foutje    moveq    #0,d0
  1041.     move.w    (a3),d0
  1042.     add.l    d0,d0
  1043.     lea    4(a3,d0.l),a0
  1044.     lea    4(a2,d0.l),a1
  1045.     lsr.l    #2,d0
  1046.     bcs.b    .v41
  1047.     addx.w    -(A0),-(a1)
  1048.     dbf    d0,.v4
  1049.     bra.b    .foutv
  1050. .v41    move    #0,CCR    
  1051. .v4    addx.l    -(a0),-(a1)
  1052.     dbf    d0,.v4
  1053. .foutv
  1054.     move.w    (a4),d0
  1055.     bclr    d3,d0
  1056.     move.w    d0,(a4)
  1057.  
  1058.     subq    #1,d3
  1059.     bcs.b    .checkm
  1060. ;=== zet bit
  1061.     move.w    (a4),d1
  1062.     bset    d3,d1
  1063.     move.w    d1,(a4)
  1064. ;=== schuif langste 1 naar links
  1065.     moveq    #1,d0
  1066.     move.l    a2,a0
  1067.     bsr.b    ShiftVIntL
  1068.     moveq    #0,d0
  1069.     roxl.w    #1,d0
  1070.     beq.w    .tmin
  1071. ;    bra    .ovf        ; overflow
  1072.  
  1073. ;=== aftrekken, aftrekken kan nu altijd
  1074. .ovf    moveq    #0,d0
  1075.     move.w    (A3),d0
  1076.     add.l    d0,d0
  1077.     lea    4(a3,d0.l),a0
  1078.     lea    4(a2,d0.l),a1
  1079.     lsr.l    #1,d0
  1080. .ov3    subx.w    -(a0),-(a1)
  1081.     dbf    d0,.ov3
  1082.     bra.w    .ovfret
  1083.     
  1084. ;====== geef een 1 mod 0 terug als antwoord
  1085. .een    moveq    #0,d0
  1086.     bsr.w    Word2VInt
  1087.     push.l    d0
  1088.     moveq    #1,d0
  1089.     bsr.w    Word2VInt
  1090.     pop.l    d1
  1091.     bra.w    .ex
  1092. ;====== geef een 0 terug als antwoord
  1093. .null    move.l    a2,a0
  1094.     bsr.w    CopyVInt
  1095.     push.l    d0
  1096.     moveq    #0,d0
  1097.     bsr.w    Word2VInt
  1098.     pop.l    d1
  1099.     bra.w    .ex
  1100.     
  1101. .freeint
  1102.     move.l    (SP)+,a1
  1103.     bsr.w    FreeVInt    ; geef int vrij
  1104.     moveq    #0,d0        ; fout-waarde
  1105.     bra.w    .ex
  1106.  
  1107. ; in  a0 = te verschuiven VInt
  1108. ;     d0 = aantal bits naar links
  1109. ; uit d0 = VInt
  1110. ShiftVIntL
  1111.     push.l    a0
  1112.     moveq    #0,d1
  1113.     move.w    (a0)+,d1
  1114.     cmp.w    #1,d0
  1115.     beq.b    .Shift1        ; maar een bit
  1116. ;===== 2 bits of meer (max. 16)    
  1117.     lea    2(a0,d1.l),a0
  1118.     add.l    d1,a0
  1119.     movem.l    d2/d3,-(SP)    
  1120.     moveq    #0,d3
  1121. .2    moveq    #0,d2
  1122.     move.w    -(a0),d2
  1123.     lsl.l    d0,d2
  1124.     or.w    d3,d2
  1125.     move.w    d2,(a0)
  1126.     swap    d2
  1127.     move.w    d2,d3
  1128.     dbf    d1,.2
  1129.     movem.l    (SP)+,d2/d3
  1130.     pop.l    d0
  1131.     rts
  1132. ;===== 1 bit
  1133. .Shift1
  1134. ;    move.w    d1,d0
  1135. ;    add.l    d1,d1
  1136. ;    lea    2(a0,d1.l),a0
  1137. ;.4    roxl    -(a0)
  1138. ;    dbf    d0,.4
  1139. ;    pop.l    d0
  1140. ;    rts
  1141.  
  1142.     move.w    d1,d0
  1143.     add.l    d1,d1
  1144.     lea    2(a0,d1.l),a0
  1145.     move.l    a0,a1
  1146.     lsr.w    #1,d0
  1147.     bcs.s    .3
  1148.     addx.w    -(a0),-(a1)
  1149.     dbf    d0,.1
  1150.     pop.l    d0
  1151.     rts
  1152. .3    move    #0,CCR
  1153. .1    addx.l    -(A0),-(a1)
  1154.     dbf    d0,.1
  1155.     pop.l    d0
  1156.     rts
  1157.  
  1158. ; in  a0 = te verschuiven VInt
  1159. ;     d0 = aantal bits naar rechts
  1160. ; uit d0 = VInt
  1161. ShiftVIntR
  1162.     push.l    a0
  1163.     moveq    #0,d1
  1164.     move.w    (a0)+,d1
  1165.     cmp.w    #1,d0
  1166.     beq.b    .Shift1        ; maar 1 bit
  1167. ;===== 2 bits of meer (max. 16)    
  1168.     movem.l    d2/d3,-(SP)    
  1169.     moveq    #0,d3
  1170. .2    moveq    #0,d2
  1171.     move.w    (a0),d2
  1172.     ror.l    d0,d2
  1173.     or.w    d3,d2
  1174.     move.w    d2,(a0)+
  1175.     swap    d2
  1176.     move.w    d2,d3
  1177.     dbf    d1,.2
  1178.     movem.l    (SP)+,d2/d3
  1179.     pop.l    d0
  1180.     rts
  1181. ;===== 1 bit
  1182. .Shift1    move    #0,CCR
  1183. .1    roxr.w    (A0)+
  1184.     dbf    d1,.1
  1185.     pop.l    d0
  1186.     rts
  1187.  
  1188. ; in  a0 = grondtal
  1189. ;     a1 = exponent
  1190. ; uit d0 = resultaat
  1191. PowerVInt
  1192.     movem.l    d2/d3/a2-a4,-(SP)
  1193.     moveq    #1,d0
  1194.     move.l    a0,a2        ; a2 = grondtal
  1195.     move.l    a1,a3        ; a3 = exponent
  1196.     bsr.w    Word2VInt
  1197.     move.l    d0,a4        ; resultaat
  1198.     tst.l    d0
  1199.     beq.w    .ex        ; da's snel
  1200.     move.l    a3,a0
  1201.     bsr.w    CopyVInt    ; copy van exponent
  1202.     move.l    d0,a3
  1203.     tst.l    d0
  1204.     beq.w    .freeres    ; helaas
  1205.     move.l    a2,a0
  1206.     bsr.w    CopyVInt    ; copy van grondtal
  1207.     move.l    d0,a2
  1208.     tst.l    d0
  1209.     beq.w    .freeres2    ; helaas
  1210. .lus    tst.l    (a3)
  1211.     beq.b    .klaar        ; klaar !!!
  1212.     moveq    #0,d0
  1213.     move.w    (a3),d0
  1214.     add.l    d0,d0
  1215.     lea    3(a3,d0.l),a0
  1216.     btst.b    #0,(a0)
  1217.     beq.b    .kwad
  1218. ;=== r*a^b = a*r*a^(b-1)
  1219.     move.l    a4,a0
  1220.     move.l    a2,a1
  1221.     bsr.w    MulVInt
  1222.     tst.l    d0
  1223.     beq.b    .freeres3    ; helaas
  1224.     move.l    a4,a1
  1225.     move.l    d0,a4
  1226.     bsr.w    FreeVInt
  1227.     pea    1.w
  1228.     move.l    SP,a1
  1229.     move.l    a3,a0
  1230.     bsr.w    SubVInt
  1231.     addq    #4,SP
  1232.     tst.l    d0
  1233.     beq.b    .freeres3    ; helaas
  1234.     move.l    a3,a1
  1235.     move.l    d0,a3
  1236.     bsr.w    FreeVInt
  1237.     bra.b    .lus
  1238. ;=== r*a^b = r*(a*a)^(b/2)
  1239. .kwad    move.l    a2,a0
  1240.     move.l    a2,a1
  1241.     bsr.w    MulVInt
  1242.     tst.l    d0
  1243.     beq.b    .freeres3    ; helaas
  1244.     move.l    a2,a1
  1245.     move.l    d0,a2
  1246.     bsr.w    FreeVInt
  1247.     move.l    a3,a0
  1248.     moveq    #1,d0
  1249.     bsr.w    ShiftVIntR
  1250.     move.l    d0,a0
  1251.     bsr.b    ShrinkVInt
  1252.     bra.b    .lus
  1253.     
  1254. .klaar    move.l    a2,a1
  1255.     bsr.w    FreeVInt
  1256.     move.l    a3,a1
  1257.     bsr.w    FreeVInt
  1258.     move.l    a4,d0    
  1259. .ex    movem.l    (SP)+,d2/d3/a2-a4
  1260.     rts
  1261.  
  1262. .freeres3
  1263.     move.l    a2,a1
  1264.     bsr.w    FreeVInt
  1265. .freeres2
  1266.     move.l    a3,a1
  1267.     bsr.w    FreeVInt
  1268. .freeres
  1269.     move.l    a4,a1
  1270.     bsr.w    FreeVInt
  1271.     moveq    #0,d0
  1272.     bra.b    .ex
  1273.         
  1274. ; in  a0 = in te krimpen VInt
  1275. ; uit d0 = ingekrompen VInt
  1276. ShrinkVInt
  1277.     move.l    a0,a1
  1278.     moveq    #0,d1
  1279.     moveq    #0,d0
  1280.     move.w    (a1)+,d1
  1281. .1    tst.w    (a1)+
  1282.     dbne    d1,.1
  1283.     bne.s    Shrink
  1284.     moveq    #0,d1        ; lengte kleiner dan 0 kan niet
  1285. Shrink    push.l    a0
  1286.     move.w    (a0),d0        ; oude lengte
  1287.     move.w    d1,(a0)        ; nieuwe lengte
  1288.     sub.w    d1,d0        ; verschil
  1289.     beq.b    .klaar
  1290.     add.l    d0,d0
  1291.     lea    2(a0,d0.l),a1
  1292.     addq.l    #2,a0
  1293. .2    move.w    (a1)+,(a0)+
  1294.     dbf    d1,.2
  1295.     move.l    a0,d1        ; a0 is einde van het getal
  1296.     addq.l    #7,d1        ; d1 = nieuwe einde +7
  1297.     add.l    d1,d0        ; d0 = oude einde +7
  1298.     and.w    #$fff8,d1
  1299.     and.w    #$fff8,d0    ; afronden (omhoog)
  1300.     sub.l    d1,d0
  1301.     beq.b    .klaar
  1302.     bcc.b    .3
  1303.     neg.w    d0
  1304. .3    move.l    d1,a1
  1305.     move.l    4.w,a6
  1306.     Lib    FreeMem
  1307. .klaar    pop.l    d0
  1308.     rts
  1309.  
  1310. CutOff    moveq    #0,d0
  1311.     subq    #1,(a0)
  1312.     move.w    (a0),d0
  1313.     add.l    d0,d0
  1314.     lea    4(a0,d0.l),a1
  1315.     move.l    a1,d0
  1316.     and.w    #7,d0
  1317.     bne.s    .klaar
  1318.     moveq    #8,d0
  1319.     move.l    4.w,a6
  1320.     LibJ    FreeMem
  1321. .klaar    rts
  1322.     
  1323. ; in  a0 = uit te breiden VInt
  1324. ; uit d0 = nieuw VInt
  1325. ExtendVInt
  1326.     moveq    #0,d0
  1327.     move.w    (a0),d0
  1328.     addq.l    #2,d0
  1329.     add.l    d0,d0
  1330.     and.w    #7,d0
  1331.     beq.s    .new
  1332.     move.l    a0,a1
  1333.     move.w    (a1)+,d0
  1334.     add.w    d0,a1
  1335.     add.w    d0,a1
  1336.     addq    #4,a1
  1337. .2    move.w    -4(a1),-(a1)
  1338.     dbf    d0,.2
  1339.     move.w    #1,-(a1)
  1340.     addq.w    #1,(a0)
  1341.     move.l    a0,d0
  1342.     rts
  1343. .new    move.l    a0,-(SP)
  1344.     move.w    (a0),d0
  1345.     addq    #1,d0
  1346.     beq.b    .err        ; sorry, tooooo long
  1347.     bsr.b    MaakVInt
  1348.     tst.l    d0
  1349.     beq.b    .err        ; no mem
  1350.     move.l    (SP)+,a1
  1351.     move.l    d0,-(SP)
  1352.     move.l    a1,-(SP)
  1353.     move.l    d0,a0
  1354.     move.w    #1,2(a0)
  1355.     moveq    #0,d0
  1356.     move.w    (a1),d0
  1357.     add.w    #4,a0
  1358.     add.w    #2,a1    
  1359. .1    move.w    (a1)+,(a0)+
  1360.     dbf    d0,.1
  1361.     move.l    (SP)+,a1
  1362.     bsr.b    FreeVInt
  1363.     move.l    (SP)+,d0
  1364.     rts
  1365. .err    move.l    (SP)+,a1
  1366.     bsr.b    FreeVInt
  1367.     moveq    #0,d0
  1368.     rts
  1369.     
  1370. ; in  d0=woord
  1371. ; uit d0=VInt
  1372. Word2VInt
  1373.     move.w    d0,-(SP)
  1374.     moveq    #0,d0
  1375.     bsr.b    MaakVInt
  1376.     tst.l    d0
  1377.     beq.s    .ex
  1378.     move.l    d0,a0
  1379.     move.w    (SP)+,2(a0)
  1380. .ex    rts
  1381.  
  1382. ; in  d0=longwoord
  1383. ; uit d0=VInt
  1384. Long2VInt
  1385.     move.l    d0,-(SP)
  1386.     tst.w    (SP)
  1387.     beq.s    .word
  1388.     moveq    #1,d0
  1389.     bsr.b    MaakVInt
  1390.     tst.l    d0
  1391.     beq.s    .ex
  1392.     move.l    d0,a0
  1393.     move.l    (SP)+,2(a0)
  1394. .ex    rts
  1395. .word    addq.l    #4,SP
  1396.     bra.s    Word2VInt
  1397.     
  1398. ; in  d0=aantal woorden in VInt -1
  1399. ; uit d0=VInt
  1400. MaakVInt
  1401.     move.l    4.w,a6
  1402.     moveq    #0,d1
  1403.     move.w    d0,d1
  1404.     addq.l    #2,d1
  1405.     add.l    d1,d1
  1406.     addq.l    #7,d1
  1407.     and.w    #$fff8,d1
  1408.     move.w    d0,-(SP)
  1409.     move.l    d1,d0
  1410.     move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  1411.     Lib    AllocMem
  1412.     tst.l    d0
  1413.     beq.s    .ex
  1414.     move.l    d0,a0
  1415.     move.w    (SP)+,(a0)
  1416. .ex    rts
  1417.  
  1418. ; in : a1 = VInt
  1419. FreeVInt
  1420.     push.l    a6
  1421.     move.l    4.w,a6
  1422.     moveq    #0,d0
  1423.     move.w    (a1),d0
  1424.     add.l    d0,d0        ; words -> bytes
  1425.     addq.l    #4,d0        ; voor aantal woorden
  1426.     addq.l    #7,d0
  1427.     and.w    #$fff8,d0    ; afronden op 8 bytes
  1428.     Lib    FreeMem
  1429.     pop.l    a6
  1430.     rts
  1431.  
  1432. ; in  : a0 = VInt
  1433. ; uit : d0 = nieuwe VInt
  1434. CopyVInt
  1435.     move.l    4.w,a6
  1436. ;=== calc len
  1437.     moveq    #0,d1
  1438.     move.w    (a0),d1
  1439.     push.l    A0
  1440.     addq.l    #2,d1
  1441.     add.l    d1,d1
  1442.     addq.l    #7,d1
  1443.     and.w    #$fff8,d1
  1444. ;=== Alloc.mem.
  1445.     move.l    d1,d0
  1446.     moveq    #MEMF_PUBLIC,d1
  1447.     Lib    AllocMem
  1448.     tst.l    d0
  1449.     beq.s    .err
  1450.     move.l    d0,a0
  1451.     pop.l    a1
  1452. ;=== copy int
  1453.     move.w    (a1)+,d1
  1454.     move.w    d1,(a0)+
  1455. .1    move.w    (a1)+,(a0)+
  1456.     dbf    d1,.1
  1457.     rts
  1458. .err    addq.l    #4,SP
  1459.     rts
  1460.  
  1461. tien    dc.l    10
  1462. tien38    dc.w    7,$4b3b,$4ca8,$5a86,$c47a
  1463.     dc.w      $098a,$2240,$0000,$0000   ; tien tot de 38e
  1464.  
  1465. Memory    moveq    #1,d1
  1466.     move.l    4.w,a6
  1467.     Lib    AvailMem
  1468.     lea    _Mem(PC),a0
  1469.     push.l    d0
  1470.     move.l    SP,a1
  1471.     bsr.w    print
  1472.     addq.l    #4,SP
  1473.     rts
  1474.     
  1475. ;===== zet getal in tekst om en vernietig het
  1476. PrintVInt38
  1477.     lea    Txt+TxtLen(a5),a2
  1478.     push.l    a0
  1479.     moveq    #18,d2
  1480. .lus    moveq    #100,d0
  1481.     bsr.w    DeelVInt
  1482.     tst.l    d0
  1483.     beq.b    .klaar        ; error
  1484.     divu    #10,d1
  1485.     or.l    #$300030,d1
  1486.     swap    d1
  1487.     move.b    d1,-(a2)
  1488.     swap    d1
  1489.     move.b    d1,-(a2)
  1490.     pop.l    a1    
  1491.     push.l    d0
  1492.     bsr.w    FreeVInt
  1493.     move.l    (SP),a0
  1494.     dbf    d2,.lus
  1495.     move.l    a0,a1
  1496.     bsr.w    FreeVInt
  1497. .klaar    addq.l    #4,SP
  1498.     move.l    a2,a0
  1499.     moveq    #38,d0
  1500.     bra.w    PrintVL
  1501.     
  1502. PrintVInt
  1503.     cmp.w    #8,(a0)
  1504.     blo.w    .rest
  1505.     movem.l    d2/a2/a3,-(SP)
  1506.     lea    tien38(PC),a1    ; begin-waarde voor deler
  1507.     push.l    a1
  1508.     move.l    SP,a3
  1509.     moveq    #0,d2
  1510.     pea    .einde(PC)    ; afsluitroutine
  1511.     move.l    a0,a2        ; sla origineel op
  1512.     
  1513. .lusop    moveq    #0,d0
  1514.     move.w    (a1),d0        ; lengte van deler
  1515.     add.l    d0,d0        ; x2
  1516.     addq.l    #1,d0
  1517.     cmp.w    (a2),d0        ; vergelijken
  1518.     bhs.b    .1        ; nu gaan we het getal afbreken en afdrukken
  1519.     move.l    a1,a0
  1520.     bsr.w    MulVInt        ; kwadrateer
  1521.     push.l    d0
  1522.     beq.b    .abort        ; helaas
  1523.     pea    .freeVInt(PC)    ; geef getal later nog terug
  1524.     subq    #8,d2        ; teller aanpassen
  1525.     move.l    d0,a1
  1526.     bra.b    .lusop        ; volgende slag
  1527.  
  1528. .abort    addq.l    #4,SP
  1529.     rts
  1530.  
  1531. .freeVInt
  1532.     pop.l    a1
  1533.     bra.w    FreeVInt
  1534.  
  1535. .einde    addq.l    #4,SP
  1536.     movem.l    (SP)+,d2/a2/a3
  1537. .ex    rts
  1538.  
  1539. .1    move.l    a2,a0
  1540.     bsr.w    DeelVIntsMod
  1541.     push.l    d1        ; zet modulo op de stack
  1542.     beq.b    .abort        ; helaas
  1543.     bra.s    .11
  1544. .halv    bsr.w    DeelVIntsMod
  1545.     tst.l    d1
  1546.     beq.b    .ex        ; helaas
  1547.     addq.l    #4,SP
  1548.     pop.l    a1        ; geef dit overbodige getal vrij
  1549.     push.l    d1        ; zet modulo op de stack
  1550.     push.l    d0        ; zet quotient op de stack
  1551.     bsr.w    FreeVInt    ; geef getal vrij
  1552.     pop.l    d0
  1553. .11    tst.w    d2
  1554.     beq.b    .prest
  1555.     addq    #8,d2
  1556.     push.w    d2
  1557.     pea    .recurp(PC)
  1558.     push.l    d0
  1559.     pea    .freeVInt(PC)
  1560.     move.l    d0,a0        ; quotient
  1561. .3    move.l    (a3,d2.w),a1    ; deler
  1562.     moveq    #0,d0
  1563.     move.w    (a1),d0        ; deler-lengte
  1564.     moveq    #0,d1
  1565.     move.w    (A0),d1        ; quotient lengte
  1566.     sub.l    d1,d0        ; vergelijken
  1567.     blo.b    .halv        ; klaar : quotient-lengte > deler-lengte
  1568.     tst.w    d2
  1569.     beq.b    .rest
  1570.     addq    #8,d2
  1571.     bra.b    .3        ; vergelijk de volgende
  1572.  
  1573. .prrest    move.l    d0,a0
  1574.     bra.b    .rest
  1575.     
  1576. .prest    move.l    d0,a0
  1577.     push.l    a0
  1578.     bsr.b    .rest
  1579.     pop.l    a1
  1580.     bsr.w    FreeVInt
  1581.     pop.l    a0
  1582.     bra.w    PrintVInt38
  1583.  
  1584. .recurp    pop.w    d2
  1585.     pop.l    a0
  1586. .4    push.l    a0
  1587.     pea    .freeVInt(PC)
  1588.     move.l    (a3,d2.w),a1
  1589.     bsr.w    DeelVIntsMod
  1590.     push.l    d1        ; modulo
  1591.     beq.w    .abort
  1592.     tst.w    d2
  1593.     beq.b    .rec1
  1594.     addq    #8,d2
  1595.     push.w    d2
  1596.     pea    .recurp(PC)
  1597.     move.l    d0,a0
  1598.     bra.b    .4
  1599.     
  1600. .rec1    pea    .printVast(PC)
  1601.     move.l    d0,a0
  1602.     bra.w    PrintVInt38
  1603.     
  1604. .rest    push.l    a2    
  1605.     lea    Txt+TxtLen(a5),a2
  1606.     moveq    #10,d0
  1607.     bsr.w    DeelVInt
  1608.     tst.l    d0
  1609.     beq.b    .klaarSP
  1610.     or.b    #'0',d1
  1611.     move.b    d1,-(a2)
  1612.     push.l    d0
  1613.     move.l    d0,a0    
  1614. .lus    moveq    #10,d0
  1615.     tst.l    (a0)
  1616.     beq.b    .klaar        ;Noc
  1617.     bsr.w    DeelVInt
  1618.     tst.l    d0
  1619.     beq.b    .klaar        ;noC
  1620.     or.b    #'0',d1
  1621.     move.b    d1,-(a2)
  1622.     pop.l    a1
  1623.     push.l    d0
  1624.     bsr.w    FreeVInt
  1625.     move.l    (SP),a0
  1626.     bra.b    .lus
  1627.  
  1628. .klaar    pop.l    a1
  1629.     bsr.w    FreeVInt
  1630. .klaarSP
  1631.     move.l    a2,a0
  1632.     lea    Txt+TxtLen(a5),a1
  1633.     sub.l    a2,a1
  1634.     move.l    a1,d0
  1635.     bsr.b    PrintVL
  1636.     pop.l    a2
  1637.     rts
  1638.     
  1639. .printVast
  1640.     pop.l    a0
  1641.     bra.w    PrintVInt38
  1642.  
  1643. PrintTxt
  1644.     movem.l    d2/d3/a6,-(SP)
  1645.     move.l    DosBase(a5),a6
  1646.     move.l    a0,d2
  1647.     move.l    OutHD(a5),d1
  1648. .1    tst.b    (a0)+
  1649.     bne.b    .1
  1650.     move.l    a0,d3
  1651.     sub.l    d2,d3
  1652.     subq    #1,d3
  1653.     Lib    Write
  1654.     movem.l    (SP)+,d2/d3/a6
  1655.     rts
  1656.  
  1657. PrintVL    movem.l    d2/d3/a6,-(SP)
  1658.     move.l    DosBase(a5),a6
  1659.     move.l    OutHD(a5),d1
  1660.     move.l    a0,d2
  1661.     move.l    d0,d3
  1662.     Lib    Write
  1663.     movem.l    (SP)+,d2/d3/a6
  1664.     rts
  1665.     
  1666. ;========
  1667. ;======== RawDoFmtTest
  1668. ;========
  1669. ; in  : a0 = string
  1670. ;       a1 = argumenten
  1671. print    movem.l    d2/d3/a2/a3/a6,-(SP)
  1672.     bsr.b    Format
  1673.     move.l    OutHD(a5),d1
  1674.     lea    OutBuff(a5),a0
  1675.     move.l    a0,d2
  1676. .1    tst.b    (a0)+
  1677.     bne.s    .1
  1678.     move.l    a0,d3
  1679.     sub.l    d2,d3
  1680.     move.l    DosBase(a5),a6
  1681.     Lib    Write
  1682.     movem.l    (SP)+,d2/d3/a2/a3/a6
  1683.     rts
  1684.  
  1685. ;====== Function that will use the string 'String' and makes an output
  1686. ;====== in OutBuff in c-style
  1687. Format    move.l    4.w,a6
  1688.     lea    Function(PC),a2    ; our store-function; this one could be used
  1689.                 ; to maintain a buffer and print it when it is
  1690.                 ; full. However our function just copies.
  1691.     lea    OutBuff(a5),a3        ; our outbuff
  1692.     LibJ    RawDoFmt    ; RawDoFmt
  1693. ;    rts            ; End of our program
  1694.  
  1695. ;=== in  : d0=byte to be printed
  1696. ;===       a3=buffer
  1697. ;=== out : a3=a3+1
  1698. Function
  1699.     move.b    d0,(a3)+
  1700.     rts
  1701.  
  1702. KeyDecodeS
  1703.     lea    (a0,d1.w),a1        ; als het aantal geldige toetsen even
  1704.                     ; is, kan de sprongtabel aan de hand
  1705.                     ; hiervan worden berekend
  1706. ;--------
  1707. ;-------- A0 = pointer naar tabel met toetsen
  1708. ;-------- A1 = pointer naar sprongtabel, met als laatste het terugsprongadres
  1709. ;-------- D0 = actuele toets
  1710. ;-------- D1 = aantal geldige toetsen
  1711. ;--------
  1712. KeyDecode
  1713.     cmp.b    #'Z',d0
  1714.     bhi.s    .1
  1715.     cmp.b    #'A',d0
  1716.     blo.s    .1
  1717.     or.b    #$20,d0            ; kleine letters van maken
  1718. .1    addq    #2,a1            ; volgende pointer
  1719.     cmp.b    (a0)+,d0        ; vergelijk of het de goede toets is
  1720.     dbeq    d1,.1            ; nee -> volgende tot aan terugsprong
  1721. .2    add.w    -(a1),a1        ; offset ophalen
  1722.     jmp    (a1)            ; sprong
  1723.  
  1724. DosNaam    DOSNAME
  1725.  
  1726.     incdir    SourcesV:VintEval/
  1727.   if nederlands
  1728.       include    Vint-Ned.teksten.S
  1729.   else
  1730.       include    Vint-Eng.teksten.S
  1731.   endif
  1732.   
  1733.